package cl.mt.data;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Collection;
import java.util.LinkedList;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import com.opensymphony.module.sitemesh.tapestry.Util;

import cl.mt.dto.DTOTipoMoneda;
import cl.mt.dto.DTOTipoRemolque;
import cl.mt.dto.DTOTipoUnidad;
import cl.mt.dto.DTOVehiculo;
import cl.mt.dto.DTOVehiculosDisponible;
import cl.mt.dto.filtros.FiltroCargaDTO;
import cl.mt.dto.filtros.PaisRegioCiudadDTO;
import cl.mt.util.Utiles;
import cl.mt.util.bd.DatosTabla;
import cl.mt.util.bd.Parametro;

public class DataVehiculo extends DatosTabla {
	private static final String sqlGetId = "SELECT MAX(ID)+1 AS IDX FROM MASTRANSPORTE.MST_VEHICULOS";
	private static final String sqlFindByPK = "SELECT ID, VHT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, GPS, OBSERVACIONES, ANIO_FABRICACION, FECHA_PUBLICACION, ESTADO, CAPACIDAD, UNT_ID, MARCA FROM MASTRANSPORTE.MST_VEHICULOS where ID=?";
	private static final String sqlFindAll = "SELECT ID, VHT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, GPS, OBSERVACIONES, ANIO_FABRICACION, FECHA_PUBLICACION, ESTADO, CAPACIDAD, UNT_ID, MARCA FROM MASTRANSPORTE.MST_VEHICULOS";
	private static final String sqlCreate = "INSERT INTO MASTRANSPORTE.MST_VEHICULOS (ID, VHT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, GPS, OBSERVACIONES, ANIO_FABRICACION, FECHA_PUBLICACION, ESTADO, CAPACIDAD, UNT_ID, MARCA) VALUES (MST_VHD_SEQ.NextVal, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
//	private static final String sqlDeleteByPK = "DELETE FROM MASTRANSPORTE.MST_VEHICULOS where ID=?";
	private static final String sqlDeleteByPK = "UPDATE MASTRANSPORTE.MST_VEHICULOS SET ELIMINADO='S' where ID=?";
	private static final String sqlCountDisponibles= "SELECT count(ID) AS cantidad FROM MASTRANSPORTE.MST_VEHICULOS";
	
	private static final String sqlVehiculosDisponibles="SELECT ID, USR_ID, VHI_ID, REM_ID, FECHA_DESDE, COMENTARIOS, FECHA_PUBLICACION, FECHA_HASTA, ESTADO, CIU_ORG_ID, RGN_ORG_ID, PAI_DST_ID, RGN_DST_ID, CIU_DST_ID, PRECIO_REFERENCIAL, PAI_ORG_ID, ELIMINADO, MOT_ID, UNT_ID, FECHA_CADUCIDAD FROM MASTRANSPORTE.MST_VEHICULOS_DISPONIBLE WHERE ELIMINADO='N' and FECHA_CADUCIDAD>=current_date";	

	private static final String sqlVehiculosDisponibleFiltro="SELECT vd.ID, vd.USR_ID, vd.VHI_ID, vd.REM_ID, vd.FECHA_DESDE, vd.COMENTARIOS, vd.FECHA_PUBLICACION, vd.FECHA_HASTA, vd.ESTADO, vd.CIU_ORG_ID, vd.RGN_ORG_ID, vd.PAI_DST_ID, vd.RGN_DST_ID, vd.CIU_DST_ID, vd.PRECIO_REFERENCIAL, vd.PAI_ORG_ID, vd.ELIMINADO, vd.MOT_ID, vd.UNT_ID, vd.FECHA_CADUCIDAD FROM MASTRANSPORTE.MST_VEHICULOS_DISPONIBLE vd , MASTRANSPORTE.vista_localidades loco, MASTRANSPORTE.vista_localidades locd WHERE ";	

	
	private static final String sqlFindAllByIdUsuario = "SELECT ID, VHT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, GPS, OBSERVACIONES, ANIO_FABRICACION, FECHA_PUBLICACION, ESTADO, CAPACIDAD, UNT_ID, MARCA FROM MASTRANSPORTE.MST_VEHICULOS where USR_ID=?";
	private static final String sqlFindVigenteByIdUsuario = "SELECT ID, VHT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, GPS, OBSERVACIONES, ANIO_FABRICACION, FECHA_PUBLICACION, ESTADO, CAPACIDAD, UNT_ID, MARCA FROM MASTRANSPORTE.MST_VEHICULOS where USR_ID=? AND ELIMINADO='N'";
	private static final String sqlUpdate = "UPDATE MASTRANSPORTE.MST_VEHICULOS SET VHT_ID=?, PLT_ID=?, ELIMINADO=?, USR_ID=?, PATENTE=?, GPS=?, OBSERVACIONES=?, ANIO_FABRICACION=?, FECHA_PUBLICACION=?, ESTADO=?, CAPACIDAD=?, UNT_ID=?, MARCA=? where ID=?";

	private Logger log = LogManager.getLogger(DataVehiculo.class.getName());

	private DTOVehiculo setDatosRegistro(ResultSet rs) throws SQLException {
		DTOVehiculo dto = new DTOVehiculo();
		dto.setId(formatInteger(rs.getObject("ID")));
		dto.setIdTipoVehiculo(formatInteger(rs.getObject("VHT_ID")));
		dto.setIdTipoPlataforma(formatInteger(rs.getObject("PLT_ID")));
		dto.setEliminado(formatString(rs.getObject("ELIMINADO")));
		dto.setIdUsuario(formatInteger(rs.getObject("USR_ID")));
		dto.setPatente(formatString(rs.getObject("PATENTE")));
		dto.setGps(formatString(rs.getObject("GPS")));
		dto.setObervaciones(formatString(rs.getObject("OBSERVACIONES")));
		dto.setAnoFabricacion(formatInteger(rs.getObject("ANIO_FABRICACION")));
		dto.setFechaPublicacion(formatDate(rs.getDate("FECHA_PUBLICACION")));
		dto.setEstado(formatString(rs.getObject("ESTADO")));
		dto.setCapacidad(formatInteger(rs.getObject("CAPACIDAD")));
		dto.setIdTipoUnidad(formatInteger(rs.getObject("UNT_ID")));
		dto.setMarca(formatString(rs.getObject("MARCA")));
		return dto;
	}

	public Integer generateId() {
		Parametro[] params = null;
		Integer id = null;
		try {
			getConnection();
			ResultSet rs = executeQuery(sqlGetId, params);
			while (rs.next()) {
				id = formatInteger(rs.getObject("IDX"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
		return id;
	}

	public DTOVehiculo findByPrimaryKey(Integer id) {

		DTOVehiculo dto = new DTOVehiculo();
		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER) };
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFindByPK, params);
			while (rs.next()) {
				dto = setDatosRegistro(rs);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return dto;
	}

	public Collection<DTOVehiculosDisponible> getVehiculosDisponibles() {

		Parametro[] params = null;
		Collection<DTOVehiculosDisponible> listVd = new LinkedList<DTOVehiculosDisponible>();
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlVehiculosDisponibles, params);
			while (rs.next()) {
				DTOVehiculosDisponible dto = setDatosRegistroVehiculoDisponible(rs);
				listVd.add(dto);
				 
			}

		} catch (Exception e) {
			log.error("error al contar los vehiculos disponibles:",e);
			
		} finally {
			closeConnection();
		}

		return listVd;
	}

	public Collection<DTOVehiculosDisponible> getVehiculosDisponiblesFiltro(FiltroCargaDTO filtro) {

		Parametro[] params = null;
		Collection<DTOVehiculosDisponible> listVd = new LinkedList<DTOVehiculosDisponible>();
		String where = armaWhere(filtro);
		log.debug("busco por filtro:"+sqlVehiculosDisponibleFiltro+where);
		
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlVehiculosDisponibleFiltro+where, params);
			while (rs.next()) {
				DTOVehiculosDisponible dto = setDatosRegistroVehiculoDisponible(rs);
				listVd.add(dto);
				 
			}

		} catch (Exception e) {
			log.error("error al contar los vehiculos disponibles:",e);
			
		} finally {
			closeConnection();
		}

		return listVd;
	}

	
	public String countVehiculosDisponibles() {

		Parametro[] params = null;
		String cant = "1656";
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlCountDisponibles, params);
			while (rs.next()) {
				cant = rs.getString("cantidad");

			}

		} catch (Exception e) {
			log.error("error al contar los vehiculos disponibles:" + e.getMessage());
			log.error(e);
		} finally {
			closeConnection();
		}

		return cant;
	}

	public Collection<DTOVehiculo> findAll() {

		Parametro[] params = null;
		Collection<DTOVehiculo> col = new LinkedList<DTOVehiculo>();
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFindAll, params);
			while (rs.next()) {
				DTOVehiculo dto = setDatosRegistro(rs);
				col.add(dto);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return col;
	}

	public int deleteByPrimaryKey(Integer id) {

		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER) };
		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlDeleteByPK, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	public int create(DTOVehiculo dto) {

		Parametro[] params = new Parametro[] {
			getParametro(dto.getIdTipoVehiculo(), Types.INTEGER),
			getParametro(dto.getIdTipoPlataforma(), Types.INTEGER),
			getParametro(dto.getEliminado(), Types.VARCHAR),
			getParametro(dto.getIdUsuario(), Types.INTEGER),
			getParametro(dto.getPatente(), Types.VARCHAR),
			getParametro(dto.getGps(), Types.VARCHAR),
			getParametro(dto.getObervaciones(), Types.VARCHAR),
			getParametro(dto.getAnoFabricacion(), Types.INTEGER),
			getParametro(formatTimestamp(dto.getFechaPublicacion()), Types.TIMESTAMP),
			getParametro(dto.getEstado(), Types.VARCHAR),
			getParametro(dto.getCapacidad(), Types.INTEGER),
			getParametro(dto.getIdTipoUnidad(), Types.INTEGER),
			getParametro(dto.getMarca(), Types.VARCHAR)
		};

		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlCreate, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	private DTOVehiculosDisponible setDatosRegistroVehiculoDisponible(ResultSet rs) throws SQLException {
		DTOVehiculosDisponible dto = new DTOVehiculosDisponible();
		
		//ID, USR_ID, VHI_ID, REM_ID, FECHA_DESDE, COMENTARIOS, FECHA_PUBLICACION, FECHA_HASTA, ESTADO, 
		//CIU_ORG_ID, RGN_ORG_ID, PAI_DST_ID, RGN_DST_ID, CIU_DST_ID, PRECIO_REFERENCIAL, PAI_ORG_ID, 
		//ELIMINADO, MOT_ID, UNT_ID, FECHA_CADUCIDAD
		
		dto.setId(formatLong(rs.getObject("ID")));
		dto.setIdVehiculo(formatString(rs.getObject("VHI_ID")));
		dto.setUsrId(formatString(rs.getObject("USR_ID")));
		dto.setRemolque(new DTOTipoRemolque(new Integer(formatString(rs.getObject("REM_ID")==null ? "-1" :rs.getObject("REM_ID")))));
		dto.setEliminado(formatString(rs.getObject("ELIMINADO")).equals("S") ? true : false);
		dto.setFechaDesde(formatDate(rs.getDate("FECHA_DESDE")));
		dto.setComentarios(formatString(rs.getObject("COMENTARIOS")));
		dto.setFechaPublicacion(formatDate(rs.getDate("FECHA_PUBLICACION")));
		dto.setFechaHasta(formatDate(rs.getDate("FECHA_HASTA")));
		dto.setEstado(formatString(Utiles.sinNull(rs.getObject("ESTADO"),"")).equals("S") ? true : false);
		 
		//origen
		PaisRegioCiudadDTO origen= new PaisRegioCiudadDTO();
		origen.setIdCiudad(formatInteger(rs.getObject("CIU_ORG_ID")).intValue());
		origen.setIdRegion(formatInteger(rs.getObject("RGN_ORG_ID")).intValue());
		origen.setIdPais(formatInteger(rs.getObject("PAI_ORG_ID")).intValue());
		dto.setOrigen(origen);
		//Destino
		PaisRegioCiudadDTO destino= new PaisRegioCiudadDTO();
		destino.setIdCiudad(formatInteger(rs.getObject("CIU_DST_ID")).intValue());
		destino.setIdRegion(formatInteger(rs.getObject("RGN_DST_ID")).intValue());
		destino.setIdPais(formatInteger(rs.getObject("PAI_DST_ID")).intValue());
		dto.setDestino(destino);
		
		dto.setMoneda(new DTOTipoMoneda(new Integer(formatString(rs.getObject("MOT_ID")))));
		dto.setUnidad(new DTOTipoUnidad(new Integer(formatString(rs.getObject("UNT_ID")))));

		
		return dto;
	}

	public int update(DTOVehiculo dto) {

		Parametro[] params = new Parametro[] {
			getParametro(dto.getIdTipoVehiculo(), Types.INTEGER),
			getParametro(dto.getIdTipoPlataforma(), Types.INTEGER),
			getParametro(dto.getEliminado(), Types.VARCHAR),
			getParametro(dto.getIdUsuario(), Types.INTEGER),
			getParametro(dto.getPatente(), Types.VARCHAR),
			getParametro(dto.getGps(), Types.VARCHAR),
			getParametro(dto.getObervaciones(), Types.VARCHAR),
			getParametro(dto.getAnoFabricacion(), Types.INTEGER),
			getParametro(formatTimestamp(dto.getFechaPublicacion()), Types.TIMESTAMP),
			getParametro(dto.getEstado(), Types.VARCHAR),
			getParametro(dto.getCapacidad(), Types.INTEGER),
			getParametro(dto.getIdTipoUnidad(), Types.INTEGER),
			getParametro(dto.getMarca(), Types.VARCHAR),
			getParametro(dto.getId(), Types.INTEGER)
		};

		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlUpdate, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	public Collection<DTOVehiculo> findByUsuario(Integer id, boolean vigente) {

		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER) };
		Collection<DTOVehiculo> col = new LinkedList<DTOVehiculo>();
		try {
			getConnection();
			String sqlFinal = vigente ? sqlFindVigenteByIdUsuario : sqlFindAllByIdUsuario;  
			ResultSet rs = executeQuery(sqlFinal, params);
			while (rs.next()) {
				DTOVehiculo dto = setDatosRegistro(rs);
				col.add(dto);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return col;

	}
	
	
	private String  armaWhere(FiltroCargaDTO filtro){
		StringBuffer where= new StringBuffer(); 
		where.append("vd.CIU_ORG_ID= loco.CIUDAD_ID and "); 
		where.append("vd.CIU_DST_ID= locd.CIUDAD_ID and ");
		where.append(" (vd.ELIMINADO='N' and vd.FECHA_CADUCIDAD>=current_date) and ");
		
		if(filtro.getFechaDesde()==null || filtro.getPaisOrigen()==null){
			where.append(" 1=1"); 
			return where.toString();
		}
		
		
		if(filtro.getFechaDesde().length()>0 && filtro.getFechaHasta().length()>0)
			where.append(" vd.FECHA_CADUCIDAD between to_date ('"+filtro.getFechaDesde()+"', 'dd/mm/yyyy') AND to_date ('"+filtro.getFechaHasta()+"' , 'dd/mm/yyyy') and ");  
	
		if((filtro.getRegionOrigen()!=null && !filtro.getRegionOrigen().equals("16"))) 
			where.append("loco.REGION_ID="+filtro.getRegionOrigen()+" and"); 
		
		if ((filtro.getRegionDestino()!=null && !filtro.getRegionDestino().equals("16"))) 
			where.append("locd.REGION_ID="+filtro.getRegionDestino()+" and "); 
		
		
		
		if((filtro.getRegionOrigen()!=null && !filtro.getRegionOrigen().equals("16"))) 
			where.append("loco.PAIS_ID="+filtro.getPaisOrigen()+" and"); 
		
		if ((filtro.getRegionDestino()!=null && !filtro.getRegionDestino().equals("16"))) 
			where.append("locd.PAIS_ID="+filtro.getPaisDestino()+" and "); 		

		
		where.append(" 1=1"); 
		
		return where.toString();
	}

}
